/*
 * conexionPFS.c
 *
 *  Created on: 21/10/2011
 *      Author: utn_so
 */

#include "libPPD.h"


void crearPoolConexiones()
{
	int32_t pool = 0;
	int32_t socketConexion, socketAccept;
	extern int32_t *vectorSockets;
	extern t_config config;
	vectorSockets = (int32_t *)calloc(config.cantConexiones,sizeof(int32_t));
	socketConexion = AFINET_abrir_conexion(config.puertoPFS);
	while (pool < config.cantConexiones)
	{
		socketAccept = aceptar_conexion(socketConexion);
		vectorSockets[pool] = socketAccept;
		pool++;
	}
}

void setearFD(struct pollfd *descriptores)
{
	extern int32_t *vectorSockets;
	extern t_config config;
	int32_t setea = 0;
	while (setea < config.cantConexiones)
	{
	descriptores[setea].fd = vectorSockets[setea];
	descriptores[setea].events = POLLIN;
	descriptores[setea].revents = 0;
	setea++;
	}

}

void recibirPedidos(struct pollfd *descriptoresLectura)
{
	int32_t cantRecibido, cantRespuestas=0;
	int32_t timeout_msecs = -1;
	extern t_config config;
	int32_t dataRecibida= 0;
	t_NIPC nipcRecibido;
	t_NIPC nipcAEnviar;
	int32_t i=0;
	int32_t j=0;
	char mensaje[] = "El Sector Se Escribio Correctamente";
	int32_t tamMensaje = strlen(mensaje);
	char *datosSector = (char *)malloc(sizeof (char)*TAMSECTOR);
	while (1)
	{
            i=0;
            j=0;
            cantRespuestas = poll(descriptoresLectura,config.cantConexiones,timeout_msecs);
            if (cantRespuestas == -1)
                    exit(0);
            else
            {
            while( i < config.cantConexiones && j < cantRespuestas)
            {
                    if (descriptoresLectura[i].revents == 17) // Ocurrio un Error, log y finalizo proceso
                            exit(0);
                    else if (descriptoresLectura[i].revents & POLLIN)
                    {

                            cantRecibido =  NIPC_recibir(descriptoresLectura[i].fd,&nipcRecibido);
                            if (nipcRecibido.PayloadDescriptor == LEERSECTOR)
                            {

                                    dataRecibida= leerSector(nipcRecibido.nroSector,datosSector);
                                    nipcAEnviar = NIPC_crearpaquete(nipcRecibido.DescriptorID,LEERSECTOR,TAMSECTOR,datosSector,nipcRecibido.nroSector);
                                    dataRecibida =  NIPC_enviar(descriptoresLectura[i].fd, nipcAEnviar);
                                    NIPC_destruirpaquete(&nipcAEnviar);

                            }
                            else if (nipcRecibido.PayloadDescriptor == ESCRIBIRSECTOR)
                            {
                                    dataRecibida = escribirSector(nipcRecibido.nroSector, nipcRecibido.payload);
                                    nipcAEnviar = NIPC_crearpaquete(nipcRecibido.DescriptorID,ESCRIBIRSECTOR,tamMensaje,mensaje,nipcRecibido.nroSector);
                                    dataRecibida =  NIPC_enviar(descriptoresLectura[i].fd, nipcAEnviar);
                                    NIPC_destruirpaquete(&nipcAEnviar);
                                    // enviar Escritura OK o alguna cosa de esas
                            }
                            NIPC_destruirpaquete(&nipcRecibido);
                            j++;
                    }
                    i++;
            }
            }
	}
	liberarMemoria(&datosSector);
}
